import UIKit

/**
    B站：https://www.bilibili.com/video/BV144411C7Gg?p=10

    第10课内容
    
        String 类型基本操作
 
        1. 字符串长度: count
        2. 查询 (索引、范围) - 截取
        3. 插入/追加
        4. 删除
        5. 遍历字符串
        6. 其他
 
*/

var str = "abcdef eh"

print("字符串长度=", str.count)

// 第一位
//str.startIndex
print(str[str.startIndex]) // a

// 最后一位
//str.endIndex
let end = str.index(before: str.endIndex)
print(str[end]) //h

// offsetBy 从0位开始
let index = str.index(str.startIndex, offsetBy: 3)
print(str[index]) //d

let index2 = str.prefix(4)
print("index2=>", index2) //abcd

// 区间范围
let sstart = str.index(str.startIndex, offsetBy: 2) //c
let send = str.index(str.startIndex, offsetBy: 5) //f
print(str[sstart...send]) // cdef


// ---------
// 从头 到指定 字符
//let b = str.firstIndex(of: "g") ?? end
//print("bbbb=>", str[str.startIndex...b])

// 为什么错误了？ --  Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
//let b = str.firstIndex(of: "g") ?? str.endIndex
//print("bbbb=>", str[str.startIndex...b])
// 解决 ..<
//print("bbbb=>", str[str.startIndex..<b])
// 理解
//print(str.endIndex, end)
//print(str.startIndex)
// startIndex = 1
// endIndex = 结尾符号
// str = 前符号 值 后符号



// 从后 往前 截取
let index3 = str.index(str.endIndex, offsetBy: -2)
print("从后往前截取字符串=>" + String( str[index3..<str.endIndex] ))

// ---------
let  index4 = str.index(after: str.startIndex)
print(str[index4])
print("--------------")
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------

// 包含
print("包含字符" + String( str.contains("g") ))

print("包含字符串串香" + String( str.contains("ab") ))

print("包含字符串串香222" + String( str.contains(where: String.contains("adk")) ))
// 【注意】 主要判断，a d k 是否在 str, 从 a 开始，包含 就不判断 d k 了，返回 true

print("字符串是否 以xx为前缀" + String( str.hasPrefix("abc") ))

print("字符串是否 以xx为后缀后" + String( str.hasSuffix("h") ))

print("--------------")
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
print("------字符串 添加/追加/插入------")
// 增删改查

let bString = "GIRL"

// 追加 (变量必须是 var 可变的)， 是在结尾追加
str.append("_srx_")
print("1", str)

str.append(bString)
print("2", str)

str.insert("x", at: str.startIndex)
print("3", str)

//错误写法
//str.insert("*boy*", at: str.index(before: str.endIndex))
//print(str)
str.insert(contentsOf: "vv", at: str.index(str.startIndex, offsetBy: 3))
print("4", str)

//--------------------------------------------------------
print("------字符串替换------")
// 1.【范围】 修改、替换
let rpIndex1 = str.index(str.startIndex, offsetBy: 1)
let rpIndex2 = str.index(str.startIndex, offsetBy: 3)
//let range = rpIndex1...rpIndex2
let rpRange = rpIndex1..<rpIndex2
str.replaceSubrange(rpRange, with: "123")
print("1", str)
// 2.【字符串】 替换
let str22 = str.replacingOccurrences(of: "123", with: "456")
print("2 - 1", str)
print("2 - 2", str22)

//--------------------------------------------------------
print("------字符串 删除------")
//删除某个索引位置
str.remove(at: str.index(str.startIndex, offsetBy: 2))
print("1", str)

// 范围删除
let rmIndex1 = str.startIndex
let rmIndex2 = str.index(str.startIndex, offsetBy: 3)
let rmRange = rmIndex1...rpIndex2
str.removeSubrange(rmRange)
print("2", str)

//str.removeFirst() // 可切换方便 被注释掉了
//str.removeLast() // 可切换方便 被注释掉了
//str.removeAll() // 可切换方便 被注释掉了
str.removeAll(where: String.contains("GIRL"))
print("3", str)
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
print("------字符串 遍历------")
for item in str {
    print(item)
}

for index in 0..<str.count {
    let forIndex = str.index(str.startIndex, offsetBy: index)
    let strchar = str[forIndex]
    print("index =", index, strchar)
}

//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
//--------------------------------------------------------
print("------字符串 ------")

let value = """
                hello
              swift
                      world
            """
print(value)

print("--1")
let value2 = """
            hello
            swift
            world
            """
print(value2)

print("--2")
let value3 = "\"hello\""
print(value3)


print("--3")
let value4 = #""hello""#
print(value4)


print("--4- # 里面可以显示任何字符")
let value5 = #""hello \\///!@#$%^&*( world""#
print(value5)
